/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.antlr.editor;
import java.beans.*;
import java.text.MessageFormat;
import org.openide.TopManager;
import org.openide.cookies.OpenCookie;
import org.openide.cookies.ViewCookie;
import org.openide.cookies.CloseCookie;
import org.openide.filesystems.*;
import org.openide.windows.TopComponent;
import org.openide.windows.CloneableTopComponent;
import org.openide.util.WeakListener;
import org.openide.loaders.DataObject;
/** Simple support for an openable file.
* Can be used either as an {@link OpenCookie}, {@link ViewCookie}, or {@link CloseCookie},
* depending on which cookies the subclass implements.
*
* @author Jaroslav Tulach
*/
public abstract class GOpenSupport extends Object {
protected DataObject obj;
/** All opened editors on this file. */
protected CloneableTopComponent.Ref allEditors = CloneableTopComponent.EMPTY;
/** listener on changes in data object */
private PropertyChangeListener listener;
public GOpenSupport(final DataObject obj) {
if (DataObject.PROP_VALID.equals (ev.getPropertyName ())) {
// loosing validity
if (!obj.isValid ()) {
close ();
}
}
}
};
// attach property change listener to be informed about loosing validity
obj.addPropertyChangeListener (new WeakListener.PropertyChange (
listener
));
}
}
/** Focuses existing component to open, or if none exists creates new.
* @see OpenCookie#open
*/
public void open () {
CloneableTopComponent editor = openCloneableTopComponent();
editor.requestFocus();
}
/** Focuses existing component to view, or if none exists creates new.
* The default implementation simply calls {@link #open}.
* @see ViewCookie#view
*/
public void view () {
open ();
}
/** Focuses existing component to view, or if none exists creates new.
* The default implementation simply calls {@link #open}.
* @see ViewCookie#view
*/
public void edit () {
open ();
}
/** Closes all components.
* @return <code>true</code> if every component is successfully closed or <code>false</code> if the user cancelled the request
* @see CloseCookie#close
*/
public boolean close () {
synchronized (allEditors) {
java.util.Enumeration en = allEditors.getComponents ();
if (!en.hasMoreElements ()) {
// nothing needs to be saved
return true;
}
// user canceled the action
if (!canClose ()) {
return false;
}
while (en.hasMoreElements ()) {
TopComponent c = (TopComponent)en.nextElement ();
if (!c.close ()) {
return false;
}
}
}
return true;
}
/** Should test whether all data is saved, and if not, prompt the user
* to save.
* The default implementation returns <code>true</code>.
*
* @return <code>true</code> if everything can be closed
*/
protected boolean canClose () {
return true;
}
/** Simply open for an editor. */
protected final CloneableTopComponent openCloneableTopComponent() {
try {
/*MessageFormat mf = new MessageFormat(DataObject.getString("CTL_ObjectOpen"));
TopManager.getDefault().setStatusText(mf.format (
new Object[] {
obj.getName(),
obj.getPrimaryFile().toString()
}
));*/
synchronized (allEditors) {
try {
CloneableTopComponent ret = (CloneableTopComponent)allEditors.getAnyComponent ();
ret.open();
return ret;
} catch (java.util.NoSuchElementException ex) {
// no opened editor
CloneableTopComponent editor = createCloneableTopComponent ();
allEditors = editor.getReference ();
editor.open();
return editor;
}
}
} finally {
//TopManager.getDefault ().setStatusText (DataObject.getString ("CTL_ObjectOpened"));
}
}
/** A method to create a new component. Must be overridden in subclasses.
* @return the cloneable top component for this support
*/
protected abstract CloneableTopComponent createCloneableTopComponent ();
}
/*
* Log
* 1 Gandalf-post-FCS1.0 4/7/00 Jesse Glick
* $
*/